// 指定该类所在的包
package com.example.emos.wx;

// 导入Hutool工具包中的字符串处理工具类
import cn.hutool.core.util.StrUtil;

// 导入自定义的SystemConstants类，可能用于存储系统配置常量
import com.example.emos.wx.config.SystemConstants;

// 导入自定义的SysConfigDao接口，可能用于数据库操作
import com.example.emos.wx.db.dao.SysConfigDao;

// 导入自定义的SysConfig类，可能用于表示系统配置项
import com.example.emos.wx.db.pojo.SysConfig;

// 使用Lombok的Slf4j注解，自动生成一个日志对象，名为log
import lombok.extern.slf4j.Slf4j;

// 导入Spring框架的相关注解和类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;

// 导入Java的注解和类
import javax.annotation.PostConstruct;
import java.io.File;
import java.lang.reflect.Field;
import java.util.List;

// 使用Spring Boot的注解，表示这是一个Spring Boot应用程序的主类
@SpringBootApplication
// 使用Spring Boot的Servlet组件扫描注解，用于自动配置Servlet组件
@ServletComponentScan
// 使用Lombok的Slf4j注解，自动生成一个日志对象，名为log
@Slf4j
@EnableAsync
public class EmosWxApiApplication {

	// 使用Spring的Autowired注解，自动注入SysConfigDao的实例
	@Autowired
	private SysConfigDao sysConfigDao;

	// 使用Spring的Autowired注解，自动注入SystemConstants的实例
	@Autowired
	private SystemConstants constants;

	@Value("${emos.image-folder}")
	private String imageFolder;

	// 应用程序的入口点
	public static void main(String[] args) {
		// 使用Spring的SpringApplication类的run方法启动Spring Boot应用程序
		SpringApplication.run(EmosWxApiApplication.class, args);
	}

	// 使用Spring的PostConstruct注解，该方法将在依赖注入完成后自动执行

	/**
	 * 这段代码的主要功能是从数据库中获取系统配置参数，并将这些参数的值设置到SystemConstants类的相应字段中。这通常用于在应用程序启动时初始化一些全局配置。
	 */
	@PostConstruct
	public void init() {
		// 从数据库中获取所有的系统配置参数
		List<SysConfig> list = sysConfigDao.selectAllParam();
		// 遍历所有的系统配置参数
		list.forEach(one -> {
			// 获取参数的键
			String key = one.getParamKey();
			// 将键转换为驼峰命名法
			key = StrUtil.toCamelCase(key);
			// 获取参数的值
			String value = one.getParamValue();
			try {
				// 使用反射获取SystemConstants类中的对应字段
				Field field = constants.getClass().getDeclaredField(key);
				// 将字段设置为对应的值
				field.set(constants, value);
			} catch (Exception e) {
				// 如果在反射过程中发生异常，则记录错误日志
				log.error("执行异常", e);
			}
		});
		// 创建图片文件夹
		new File(imageFolder).mkdirs();
	}
}